<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 17/03/2012.
   * @last_update 24/03/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_ContasReceber extends Zend_Db_Table_Abstract{
    const IND_ATIVO = 1;
    const IND_INATIVO = 0;
    
    /* Seta a tabela a ser usada*/
    protected function _setup(){
      $this->_name = 'contas_receber';
      
      parent::_setup();
    }
    
    /**
     * Retorna a string SELECT como todos os campos solicitados por parametro.
     * @param array Array com as opções de colunas e clausulá WHERE.
     *              Ex: Colunas:
     *                  $arrOptions['fields_perfil'] = array('campo1', 'campo2', 'campoN').
     *                  
     *                  WHERE
     *                    $arrOptions['where_clause'] = array('ds_peril' => 'usuario')
     * @param string  Comparação.Ex: =, LIKE NOT LIKE, etc  
     *                    
     * @return string                   
     */
    public function _get($arrOptions = array(), $strComparison = '='){
      $arrAlias     = array('cr' => $this->_name);
      
      if(isset($arrOptions['fields']))
        $arrCols = $arrOptions['fields'];
      else
        $arrCols = array('cr.*');
          
      $strSql = $this->getAdapter()
      ->select()
      ->from($arrAlias, $arrCols);
      
      if(isset($arrOptions['where_clause']))
        foreach($arrOptions['where_clause'] as $strkey => $strValue)
          $strSql->where($strkey . $strComparison . ' ?', $strValue);  
          
      $strSql->order('cr.idConta_receber');
      
      return $strSql;
    }
    
    /**
     * Retorna o registro
     * 
     * @param integer Id do registro
     * @return databasen result
     */
    public function get($intId = null){
      if($intId == null)
        return false;
      
      $arrOptions['fields'] = array(
        'cr.idConta_receber',
        'cr.idAluno',
        'cr.idModulo',
        'cr.nr_parcela',
        'cr.nr_valor',
        'cr.dt_vencimento',
        'cr.ds_situacao',
        'cr.dt_recebimento',
        'cr.dt_insercao',
        'cr.dt_atualizacao'
      );
      
      $arrOptions['where_clause'] = array(
        'cr.ds_situacao'      => self::IND_ATIVO,
        'cr.idConta_receber'  => $intId   
      );
      
      $strSql = $this->_get($arrOptions);  
        
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    public function getAtivos(){
      $strSql = $this->select()->where('ds_situacao = ?', self::ATIVO);
      
      $objResult = $this->fetchAll($strSql);
      
      return Core_Commons::onLoad($objResult);
    }
    
    public function salvarByArray($arrDados, $intId = null){
      if($intId == null){
        $arrDados['dt_atualizacao'] = 'NULL';
            
        $strSql = $this->select()
        ->where("idAluno = ?", $arrDados['idAluno'])
        ->where("idModulo = ?", $arrDados['idModulo'])
        ->where("nr_parcela = ?", $arrDados['nr_parcela'])
        ;
        
        if($this->fetchAll($strSql)->current())
          throw new Exception('Parcelas já cadastradas para este Aluno!', '3');
        else
          return $this->insert($arrDados);
      }
      else{
        $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
        
        return $this->update($arrDados, 'idConta_receber = ' . $intId);  
      }
    }
    
    public function getByAluno($intCodAluno){
    	$arrOptions['fields'] = array(
        'cr.idConta_receber',
        'cr.idAluno',
        'cr.idModulo',
        'cr.nr_parcela',
        'cr.nr_valor',
        'cr.dt_vencimento',
        'cr.ds_situacao',
        'cr.dt_recebimento',
        'cr.dt_insercao',
        'cr.dt_atualizacao'
      );
      
    	$arrOptions['where_clause'] = array(
    	  'cr.ds_situacao' => self::IND_ATIVO, 
        'idAluno'        => $intCodAluno   
      );
      
      $strSql = $this->_get($arrOptions);  
      
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    public function getById($intIdContaReceber){
      $arrOptions['fields'] = array(
        'cr.idConta_receber',
        'cr.idAluno',
        'cr.idModulo',
        'cr.nr_parcela',
        'cr.nr_valor',
        'cr.dt_vencimento',
        'cr.ds_situacao',
        'cr.dt_recebimento',
        'cr.dt_insercao',
        'cr.dt_atualizacao',
        'a.ds_nome',
        'a.ds_endereco',
        'a.nr_residencia',
        'a.ds_complemento',
        'a.ds_cep',
        'c.ds_cidade',
        'e.ds_sigla',
        'u.ds_unidade',
        'u.ds_razao_social',
        'u.ds_site',
        'u.ds_fone',
        'u.ds_cnpj',
        'endereco_unidade'  => 'u.ds_endereco',
        'numero_endereco_unidade' => 'u.nr_unidade',
        'complemento_unidade' =>  'u.ds_complemento',
        'cs.ds_curso',
        'm.ds_modulo',
        'cidade_unidade' => 'c2.ds_cidade',
        'estado_unidade' => 'e2.ds_sigla',
      );
      
      $arrOptions['where_clause'] = array(
        'cr.ds_situacao'      => self::IND_ATIVO, 
        'cr.idConta_receber'  => $intIdContaReceber   
      );
      
      $strSql = $this->_get($arrOptions)
      ->join(array('a' => 'alunos'), 'a.idAluno = cr.idAluno', array())
      ->join(array('c' => 'cidades'), 'c.idCidade = a.idCidade', array())
      ->join(array('e' => 'estados'), 'e.idEstado = c.idEstado', array())
      ->join(array('m' => 'modulos'), 'm.idModulo = cr.idModulo', array())
      ->join(array('cs' => 'cursos'), 'cs.idCurso = m.idCurso', array())
      ->join(array('uc' => 'unidade_curso'), 'uc.idCurso = cs.idCurso', array())
      ->join(array('u' => 'unidade'), 'u.idUnidade = uc.idUnidade', array())
      ->join(array('c2' => 'cidades'), 'c2.idCidade = u.idCidade', array())
      ->join(array('e2' => 'estados'), 'e2.idEstado = c2.idEstado', array())
      ;  
      
      $objResult = $this->getAdapter()->fetchRow($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
  }